認証の件

11 6月

PHPでの認証の記事はよくあるのですが、いったん認証された後、$_SERVER[‘PHP_AUTH_USER’]などの値がどこまで継続して使用できるのかどうか確認しました。

大まかには、最初にPHPで認証させてHTMLを表示させます。この後、Webサーバーに、$_SERVER[‘PHP_AUTH_USER’]を返信させます。

下記が、最初にアクセスするPHPです(このコードは「初めてのPHP&MySQL」という書籍の例題を書きかえたものです)。前半が認証するところです。testというデータベースがあって、testuserというユーザーが居ます。このユーザーを読み取りだけができる限定された権限のユーザーとしました。ログイン認証用の画面がポップアップで表示されるのですが、そこで入力するユーザーとは別のユーザーです。ログインするユーザーは書きかえる権限を持つユーザーを想定しています。この他、authors というテーブルがあって、パスワードなどが記録されています。

<?php

$db_host='localhost';
$db_database='test';
$db_username='testuser';
$db_password='apassword';

require_once("Auth/HTTP.php");

$AuthOpts = array('dsn' => "mysql://$db_username:$db_password@$db_host/$db_database",
'table' => "authors", // テーブル名
'usernamecol' => "name", // ユーザ名の列
'passwordcol' => "password", // パスワードの列
'cryptType' => "md5" // パスワードの暗号化方法
);
$authenticate = new Auth_HTTP("DB", $AuthOpts);
// レルム名を設定
$authenticate->setRealm('Member Area');
// 認証失敗時のメッセージ
$authenticate->setCancelText('<h2>Access Denied</h2>');
// 認証を開始
$authenticate->start(  );
// ユーザ名とパスワードをデータベースと照合
if ($authenticate->getAuth(  )){

$somebody = $authenticate->username;

echo <<< src_no_owari
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">

<title>test auth</title>

<script type="text/javascript" src="jquery/jquery.min.js"></script>

<script type="text/javascript">
//<![CDTA[

function call_php() {

// ダミー
var tmp = new Date().getTime();

$.ajax({
url:"test.php",
type:'post',
dataType:'text',
data:{'param1':tmp},
timeout:5000,
async:false,
success:function(returntext,status){

if(status!='success')return;

alert(returntext);

} });

}

//]]>
</script>

</head>
<body>

<button type="button" id="" class="" onclick="call_php();" style=";">
Call PHP
</button>

</body>
</html>
src_no_owari;
}
?>

上記コードの後半で、認証後、HTMLが書き出されます。ただボタンがひとつあるだけのものです。クライアントから見れば、ただのHTMLです。この場合に、あらためてWebサーバーにアクセスして、認証の継続を確認してみました。ボタンを押すと、test.phpを呼び出します。test.phpは下記です。

<?php

echo $_SERVER['PHP_AUTH_USER'];

?>

$_SERVER[‘PHP_AUTH_USER’]を返すだけのものですが、確かにログインしたユーザー名が返って来ました。つまり、Webサーバーがユーザーを記憶しているようですので、次にデータベースにアクセスするときには、クライアントからユーザー名とパスワードを送る必要は無いようです。